﻿#pragma once
#ifndef WRCLASS_H
#define WRCLASS_H

#include <QUuid>
#include <QString>
#include <QDomElement>
#include "WRClassActivator.h"

//表示可以动态创建的类信息。
class WRClass
{
    friend class WRClassManager;

private:
    QUuid m_uuid;
    QString m_name;
    WRClassActivator* m_init;

    //复制构造函数（未实现）。
    WRClass(const WRClass& other);
    //赋值操作符（未实现）。
    WRClass& operator=(const WRClass& other);

    //构造函数（请勿直接调用）。
    inline WRClass(const QUuid& uuid, const QString& name, WRClassActivator* init)
        : m_uuid(uuid), m_name(name), m_init(init)
    {
        //add code here
    }
    //析构函数。
    inline ~WRClass()
    {
        //add code here
    }

public:
    //获取类标识。
    inline const QUuid& uuid(void) const
    {
        return m_uuid;
    }
    //获取类名称。
    inline const QString& name(void) const
    {
        return m_name;
    }

    //获取构造器。
    template <class T> inline T* cast(const QUuid& tuid) const
    {
        if (m_init->identify(tuid))
        {
            return static_cast<T*>(m_init);
        }
        return 0;
    }

    //获取指定标识的类信息。
    WRSOFT_UTILITY_API static WRClass* select(const QUuid& uuid);
    //获取指定名称的类信息。
    WRSOFT_UTILITY_API static WRClass* select(const QString& name);
    //获取指定配置的类信息。
    WRSOFT_UTILITY_API static WRClass* select(const QDomElement& config);
    //注册新的类信息。
    WRSOFT_UTILITY_API static WRClass* enroll(const QUuid& uuid, const QString& name, WRClassActivator* init);
};

#endif // WRCLASS_H
